﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace AMVNewsParser
{
    class Gl
    {

        public static String fPathAmvInfo;
        public static string dPathHtmlDataAmvNews;
        public static string dPathHtmlDataAkross;
        public static string dPathHtmlDataCreaCon;
        public static string dPathAMVInfoResult;

        public static List<AMVInfoSpace.AMVInfo> infoL = new List<AMVInfoSpace.AMVInfo>();

        // разбивка на слова. Слова состоят только из букв и цифр. Остальное считается разделителем. Слова приводятся к верхнему регистру
        // слова только длиной > 1 буквы
        public static List<string> SplitTextByFind(string s)
        {
            List<string> ret = new List<string>();
            for (int i = 0; i < s.Length; i++)
            {
                int n = (int)s[i];
                if ((n < 48 || (n > 57 && n < 65) || (n > 90 && n < 97) || (n > 122 && n < 1040) || (n > 1103)) && n != 1025 && n != 1105)
                    s = s.Replace(s[i], ' ');
            }
            string[] sl = s.Split(' ');
            for (int i = 0; i < sl.Length; i++)
            {
                if (sl[i].Trim() != "")
                {
                    if (sl[i].Trim().Length > 1)
                        ret.Add(sl[i].Trim().ToUpper());
                }
            }
            return ret;
        }

        #region *** GetSubstring *******************************************************************

        /// <summary> Возвращает текст между ключевыми словами StartStr и EndStr
        /// Находится любое из StartStr. Как только оно найдено, от него находится самое близкое из EndStr
        /// Полученый отрезок возвращается, а строка STR укорачивается до найденного EndStr включительно (то есть найденый EndStr тоже удаляется)
        /// </summary>
        /// <param name="StartStr">набор строк для поиска старта</param>
        /// <param name="EndStr">набор слов для поиска окончания</param>
        /// <param name="STR">общий текст</param>
        public static string GetSubstring(string[] StartStr, string[] EndStr, ref string STR)
        {
            string ret = "";

            int indSt = -1;
            int keyStartLen = 0;
            // нахождение позиции начала
            foreach (string keyStr in StartStr)
            {
                keyStartLen = keyStr.Length;
                indSt = STR.IndexOf(keyStr);
                if (indSt != -1) break;
            }
            if (indSt == -1) throw new Exception("Не найдено стартовое ключевое слово");
            indSt += keyStartLen;

            // нахождение всех возможных позиций окончания
            List<int> indEnList = new List<int>();
            List<int> keyEndLenList = new List<int>();
            foreach (string keyStr in EndStr)
            {
                int ind = STR.IndexOf(keyStr, indSt + keyStartLen);
                if (ind != -1)
                {
                    indEnList.Add(ind);
                    keyEndLenList.Add(keyStr.Length);
                }
            }
            if (indEnList.Count == 0) throw new Exception("Не найдено ключевое слово для окончания");

            // нахождение ближайшей позиции из всех возможных позиций окончания
            int indEn = int.MaxValue;
            int keyEndLen = 0;
            for (int i = 0; i < indEnList.Count; i++) if (indEn > indEnList[i]) { indEn = indEnList[i]; keyEndLen = keyEndLenList[i]; }

            // находим строку 
            ret = STR.Substring(indSt, indEn - indSt);
            // удаляем теги
            ret = DelTags(ret);
            // сокращаем основной текст
            STR = STR.Substring(indEn + keyEndLen);

            return ret;
        }

        /// <summary> Возвращает текст между ключевыми строками в паре KeyStrGate
        /// строка STR укорачивается до второй ключевой строки включительно (то есть найденая вторая ключевая строка тоже удаляется из STR)
        /// </summary>
        /// <param name="KeyStrGate">набор пар строк между которыми находится искомая строка</param>
        /// <param name="STR">общий текст</param>
        public static string GetSubstring(Dictionary<string, string> KeyStrGate, ref string STR)
        {
            string ret = "";
            foreach (KeyValuePair<string, string> val in KeyStrGate)
            {
                try
                {
                    ret = GetSubstring(val.Key, val.Value, ref STR);
                    return ret;
                }
                catch { }
            }
            throw new Exception("Подстрока не найдена");
        }

        /// <summary> Возвращает текст между ключевыми строками StartStr и EndStr
        /// строка STR укорачивается до EndStr включительно (то есть найденая EndStr тоже удаляется из STR)
        /// </summary>
        /// <param name="StartStr">строка для поиска старта</param>
        /// <param name="EndStr">строка для поиска окончания</param>
        /// <param name="STR">общий текст</param>
        public static string GetSubstring(string StartStr, string EndStr, ref string STR)
        {
            string ret = "";

            // нахождение начала
            int indSt = STR.IndexOf(StartStr);
            if (indSt == -1) throw new Exception("Не найдено стартовое ключевое слово");
            indSt += StartStr.Length;

            // нахождение окончания
            int indEn = STR.IndexOf(EndStr, indSt);
            if (indEn == -1) throw new Exception("Не найдено ключевое слово окончания");

            // находим строку 
            ret = STR.Substring(indSt, indEn - indSt);
            // удаляем теги
            ret = DelTags(ret);
            // сокращаем основной текст
            STR = STR.Substring(indEn + EndStr.Length);

            return ret;
        }

        public static string DelTags(string str)
        {
            StringBuilder ret = new StringBuilder();
            str = str.Replace("<br>", "\r\n").Replace("<BR>", "\r\n").Replace("&nbsp;", " ");
            while (true)
            {
                int ind = str.IndexOf("<");
                if (ind == -1) break;
                int ind1 = str.IndexOf(">");
                if (ind1 == -1)
                {
                    System.Windows.Forms.MessageBox.Show("При удалении тегов, найден открывающий тег и не найден закрывающий\r\n СТРОКА: " + str);
                    break;
                }
                if (ind != 0) ret.Append(str.Substring(0, ind));
                str = str.Substring(ind1 + 1, str.Length - (ind1 + 1));
            }
            ret.Append(str);
            return ret.ToString().Trim();
        }

        #endregion *** GetSubstring *******************************************************************

    }

}
